/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package framework.db;

import framework.config.Database;
import framework.data.Produto;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Thairony
 */
public class ProdutoManager
{
    private static ProdutoManager instance;

    /**
     * 
     * @return 
     */
    public static ProdutoManager getInstance()
    {
        if ( instance == null )
        {
            instance = new ProdutoManager();
        }

        return instance;
    }
    
    /**
     * 
     * @return
     * @throws Exception 
     */
    private Database getDatabase() throws Exception
    {
        return Database.getInstance();
    }
    
    /**
     * 
     * @param Produto
     * @throws Exception 
     */
    public void addProduto( Produto produto ) throws Exception
    {
        Database db = getDatabase();
        
        produto.setCodigo( db.getNextId( "produto" ) );
        
        try
        {
            String sql = "insert into produto (" + 
                    " codigo, " +
                    " alternativo, " +
                    " descricao, " +
                    " estruturado, " +
                    " fornecedor, " +
                    " imposto, " +
                    " mensagem, " +
                    " ncm " +
                    " ) values ( " +
                    " ?, ?, ?, ?, ?, ?, ?, ? )";

            PreparedStatement ps = db.prepareStatement( sql );
            
            int i = 1;
            ps.setInt( i++, produto.getCodigo() );
            ps.setString( i++, produto.getAlternativo() );
            ps.setString( i++, produto.getDescricao() );
            ps.setString( i++, produto.getEstruturado() );
            ps.setInt( i++, produto.getFornecedor() );
            ps.setInt( i++, produto.getImposto() );
            ps.setInt( i++, produto.getMensagem() );
            ps.setInt( i++, produto.getNcm() );
            
            ps.execute();
        }
        
        finally
        {
            db.close();
        }           
    }
    
    /**
     * 
     * @param Produto
     * @throws Exception 
     */
    public void updateProduto( Produto produto ) throws Exception
    {
        Database db = getDatabase();
        
        try
        {
            String sql = "update Produto set " + 
                    " alternativo = ?," +
                    " descricao = ?," +
                    " estruturado = ?," +
                    " fornecedor = ?," +
                    " imposto = ?," +
                    " mensagem = ?," +
                    " ncm = ? " +
                    " where " +
                    " codigo = ? ";

            PreparedStatement ps = db.prepareStatement( sql );
            
            int i = 1;
            ps.setString( i++, produto.getAlternativo() );
            ps.setString( i++, produto.getDescricao() );
            ps.setString( i++, produto.getEstruturado() );
            ps.setInt( i++, produto.getFornecedor() );
            ps.setInt( i++, produto.getImposto() );
            ps.setInt( i++, produto.getMensagem() );
            ps.setInt( i++, produto.getNcm() );
            ps.setInt( i++, produto.getCodigo() );
            
            ps.execute();
        }
        
        finally
        {
            db.close();
        }           
    }
    
    /**
     * 
     * @return
     * @throws Exception 
     */
    public List<Produto> getProduto() throws Exception
    {
        Database db = getDatabase();
        
        try
        {
            String sql = Selects.SELECT_PRODUTO;
            
            PreparedStatement ps = db.prepareStatement( sql );
            
            return fetchProdutos( ps );
        }
        
        finally
        {
            db.close();
        }
    }
    
    /**
     * 
     * @param codigo
     * @return
     * @throws Exception 
     */
    public Produto getProduto( int codigo ) throws Exception
    {
        Database db = getDatabase();
        
        try
        {
            String sql = Selects.SELECT_PRODUTO +
                    " where " +
                    " codigo = ?";
            
            PreparedStatement ps = db.prepareStatement( sql );
            
            ps.setInt( 1, codigo );
            
            return fetchProduto( ps );
        }
        
        finally
        {
            db.close();
        }
    }
    
    /**
     * 
     * @param st
     * @return
     * @throws Exception 
     */
    private List<Produto> fetchProdutos( PreparedStatement st ) throws Exception
    {
        ResultSet rs = st.executeQuery();
        
        List<Produto> usuarios = new ArrayList<Produto>();
        
        while ( rs.next() )
        {
            Produto produto = new Produto();
        
            int i = 1;
            produto.setCodigo( rs.getInt( i++ ) );
            produto.setAlternativo( rs.getString( i++ ) );
            produto.setDescricao( rs.getString( i++ ) );
            produto.setEstruturado( rs.getString( i++ ) );
            produto.setFornecedor( rs.getInt( i++ ) );
            produto.setImposto( rs.getInt( i++ ) );
            produto.setMensagem( rs.getInt( i++ ) );
            produto.setNcm( rs.getInt( i++ ) );

            usuarios.add( produto );
        }
        
        return usuarios;
    }
    
    /**
     * 
     * @param st
     * @return
     * @throws Exception 
     */
    private Produto fetchProduto( PreparedStatement st ) throws Exception
    {
        ResultSet rs = st.executeQuery();
        
        Produto produto = null;
        
        if ( rs.next() )
        {
            produto = new Produto();

            int i = 1;
            produto.setCodigo( rs.getInt( i++ ) );
            produto.setAlternativo( rs.getString( i++ ) );
            produto.setDescricao( rs.getString( i++ ) );
            produto.setEstruturado( rs.getString( i++ ) );
            produto.setFornecedor( rs.getInt( i++ ) );
            produto.setImposto( rs.getInt( i++ ) );
            produto.setMensagem( rs.getInt( i++ ) );
            produto.setNcm( rs.getInt( i++ ) );
        }
            
        return produto;
    }
}
